package ma.ensao.egicom.bank.services.dao.interfaces;

import java.util.List;
import java.util.Map;

import ma.ensao.egicom.bank.services.model.Operation;

/**
 * Interface d'acc&egrave;s aux donn&eacute;es pour l'entit&eacute; persistante <code>Operation</code>.
 * @author MILHI Yassine (milhi.yassinee@gmail.com)
 */
public interface OperationDao {

    /**
     * Cr&eacute;&eacute; une op&eacute;ration bancaire.
     * @param operation le compte &agrave; cr&eacute;er
     */
    void createOperation(Operation operation);

    /**
     * Supprim&eacute; l'op&eacute;ration bancaire.
     * @param operation le compte &agrave; supprimer
     */
    void deleteOperation(Operation operation);

    /**
     * R&eacute;cuper&eacute; l'op&eacute;ration bancaire correspondant &agrave; l'identifiant unique sp&eacute;cifi&eacute;.
     * @param idOperation identifiant de l'op&eacute;ration
     * @return l'op&eacute;ration trouv&eacute;e
     */
    Operation getOperationById(Long idOperation);

    /**
     * Mise &agrave; jour d'une op&eacute;ration.
     * @param account le compte sp&eacute;cifi&eacute;
     */
    void updateOperation(Operation account);

    /**
     * Retourne une liste d'op&eacute;rations respectant un filtre.
     * @param propertyName le nom de la proprit&eacute; dans la table
     * @param value la valeur &agrave; filter avec
     * @return une liste des op&eacute;rations qui respectent le filtre
     */
    List<Operation> getOperationByProperty(String propertyName, Object value);

    /**
     * Retourne une liste d'op&eacute;rations respectant les filtres.
     * @param properties une map des propri&eacute;tes cl&eacute;(le nom de la propri&eacute;t&eacute;) / valeur (La valeur de la propri&eacute;t&eacute;).
     * @return une liste des compte qui respectent les filtres
     */
    List<Operation> getOperationByProperties(Map<String, Object> properties);

}
